package kernel.loaders;

import java.io.IOException;
import kernel.loaders.ascii.ASCIISTLParser;
import kernel.loaders.ascii.ASCIIScanner;
import kernel.loaders.binary.BinaryParser;
import kernel.loaders.binary.BinaryScanner;
import kernel.loaders.exception.InvalidCodificationTypeException;
import kernel.stl.*;

/**Classe que faz a leitura de arquivos STL. 
 * Ela utiliza um parser para fazer a leitura dos arquivos. Existem duas
 * codificações possíveis para os STLs: ASCII e Binário. Para cada uma delas
 * deve ser implementado um parser diferente. Atualmente, apenas o parser
 * para a codificação ASCII está funcionando corretamente.
 * @author George
 */
public class STLFileLoader {
    
    public static final int ASCII = 0, BINARY = 1;
    
    /**Carrega um stl a partir de um nome de arquivo. 
     * @param codificationType especifica o tipo de codificação. Utilize 0 para
     * ASCIII e 1 para binary. Atualmente a leitura de arquivos binários não 
     * funciona corretamente.
     * @return objeto STL que representa o objeto tridimensional.
     * @throws java.io.IOException Caso ocorra algum problema na leitura do arquivo
     * @throws kernel.loaders.exception.InvalidCodificationTypeException Caso
     * uma codificação inválida seja utilizada.
     */
    public STL load(String fileName, int codificationType) throws IOException, 
            InvalidCodificationTypeException {          
        if (codificationType == ASCII) {
            SourceSTLFile sourceFile = new SourceSTLFile(fileName);        
            ASCIIScanner scanner = new ASCIIScanner(sourceFile);        
            ASCIISTLParser asciiParser = new ASCIISTLParser(scanner);
            STL stl = asciiParser.parseSTL();        
            stl.setFileName(fileName);
            return stl;            
        } else if (codificationType == BINARY) {     
            BinaryScanner binaryScanner = new BinaryScanner(fileName);
            BinaryParser binaryParser = new BinaryParser(binaryScanner);
            STL stl = binaryParser.parseSTL();        
            stl.setFileName(fileName);
            return stl;                
        }  
        else
            throw new InvalidCodificationTypeException();        
    }

}
